#include "common.hpp"

static const char *optString = "h?";

static const struct option longOpts[] = {
    { "help", no_argument, NULL, 'h' }
};

int main (int argc, char* const argv[]) {
	ipc::bounded_counter lugares( ftok(BASE_NAME,11), ftok(BASE_NAME,10),0 );
	ipc::bounded_counter entrenadores_disponibles( ftok(BASE_NAME,21), ftok(BASE_NAME,20),0 );
	ipc::bounded_counter pantalla_gigante_aviso ( ftok(BASE_NAME,27), ftok(BASE_NAME,26),0 );

	monitor_reservas reservas(ftok(BASE_NAME,13),ftok(BASE_NAME,12),0);

	monitor_aparatos aparatos(ftok(BASE_NAME,15), ftok(BASE_NAME,14),0);

	ipc::messages_queue cola1 ( ftok(BASE_NAME,16) );
	ipc::messages_queue cola2 ( ftok(BASE_NAME,17) );
	ipc::messages_queue colaRecepcion (ftok(BASE_NAME,18) );
	ipc::messages_queue colaAtencion (ftok(BASE_NAME,19) );

	ipc::semaphore control_ingreso ( ftok(BASE_NAME,30),0 );
	ipc::semaphore pantalla_gigante_mostrar ( ftok(BASE_NAME,25),0 );
	
	int longIndex = 0;
	int option = 0;
	while ( (option = getopt_long(argc,argv,optString,longOpts,&longIndex) ) != EOF ) {
		switch (option) {
			case '?':
			case 'h':
			case ':':
				std::cerr << "Proceso para liberación del entorno de ejecución." << std::endl;
				std::cerr << "\tUso: " << argv[0] << " [-h]" << std::endl;
				std::cerr << "\tParametros:" << std::endl;
				std::cerr << "\t\t-h,--help:\tMostrar este mensaje de ayuda." << std::endl;

				return 0;
			default:
				break;
		}
	}

	logger.setColor("\033[2;31m");
	
	if ( lugares.get(PERMITS) == 0) {
		logger << "Destructor: Lugares ocupados: " << lugares.getActual() << nl;
		lugares.destroy();
	}


	if ( entrenadores_disponibles.get(PERMITS) == 0) {
		logger << "Destructor: Entrenadores disponibles: " << entrenadores_disponibles.getActual() << nl;
		entrenadores_disponibles.destroy();	
	}
	
	if ( reservas.get(PERMITS) == 0) {
		utils::logger_stream::multi_line calendario(reservas.calendario());
		logger << "Destructor: " << calendario << nl;
		reservas.destroy();
	}

	if ( aparatos.get(PERMITS) == 0)
		aparatos.destroy();
	if ( pantalla_gigante_aviso.get(PERMITS) == 0)
		pantalla_gigante_aviso.destroy();

	if ( cola1.get(PERMITS) == 0)
		cola1.destroy();
	if ( cola2.get(PERMITS) == 0)
		cola2.destroy();
	if ( colaRecepcion.get(PERMITS) == 0)
		colaRecepcion.destroy();
	if ( colaAtencion.get(PERMITS) == 0)
		colaAtencion.destroy();

	if ( control_ingreso.get(PERMITS) == 0)
		control_ingreso.destroy();
	if ( pantalla_gigante_mostrar.get(PERMITS) == 0)
		pantalla_gigante_mostrar.destroy();

	return 0;
}

